"""
Emotion recognition templates for the emobot project.
基于Plutchik情绪轮的一级和二级情绪分类体系
"""


class EmotionRecognitionTemplates:
    """Templates for emotion recognition prompts."""

    # 情绪分类体系
    EMOTION_HIERARCHY = {
        "Joy": {
            "Serenity": "低激活的积极情绪；评估为安全、可控、需求已满足；功能是维持与恢复能量、促进社会凝聚。",
            "Joy": "中等激活的奖励达成情绪；评估为目标实现与共享价值；促进接近、表达与合作。",
            "Ecstasy": "极高激活的强正向高峰体验；评估为重大奖赏与意义扩张；强化联结与庆祝，但可能降低审慎控制。",
        },
        "Sadness": {
            "Pensiveness": "轻度哀伤与反思；评估为轻微损失或未满足；功能是复盘、意义整合与自我调节。",
            "Sadness": "中强度的损失情绪；评估为重要目标/关系受损、控制感下降；促进退缩、寻求安慰与社会支持。",
            "Grief": "高强度、长期化的丧失反应；评估为不可逆重大损失与意义崩塌；功能是哀悼与意义重建，伴随高生理压力负荷。",
        },
        "Trust": {
            "Acceptance": "低激活正向；评估为现实可承受且抵抗无益；功能是停止徒劳对抗、进行适应性调整。",
            "Trust": "对他者意图与能力的正面预测；评估为可预测、可靠、风险可控；促进合作、授权与依赖。",
            "Admiration": "对他者能力/品格的高评价；评估为值得学习与模仿；驱动靠拢、模仿与社会赞赏。",
        },
        "Disgust": {
            "Boredom": "低激活负性，由刺激或意义不足引发；评估为当前活动价值低；功能是促使寻求新颖与目标重设。",
            "Disgust": "对污染（生物/道德）的排斥反应；评估为威胁纯净或规范；功能是远离、拒绝与清除。",
            "Loathing": "极强烈厌恶与道德排斥；评估为严重冒犯或污秽；倾向于隔绝、驱逐与断联。",
        },
        "Fear": {
            "Apprehension": "低至中激活的预期性威胁感；评估为不确定风险、尚可应对；功能是准备与防范。",
            "Fear": "中高激活的威胁反应；评估为威胁显著、控制低；触发逃跑、冻结或求助。",
            "Terror": "极高激活、即时生存威胁；评估为控制近乎为零；可能出现惊恐、解体与认知收缩。",
        },
        "Anger": {
            "Annoyance": "低强度愤怒；评估为轻微阻碍或不敬；功能是设定界限与反馈纠偏。",
            "Anger": "中强度攻势性情绪；评估为他方有责的不公或阻碍；驱动对抗、施压与改变现状。",
            "Rage": "高强度、可能失控的愤怒；评估为严重冒犯/压迫；促进攻击与报复，伴随高风险冲动。",
        },
        "Surprise": {
            "Distraction": "注意被新奇或干扰短暂劫持；评估为轻度新奇与任务竞争；功能是快速转向潜在重要刺激。",
            "Surprise": "对预测误差的快速反应；评估为高新奇、效价未定；功能是重置加工、更新内在模型。",
            "Amazement": "高强度、正效价的惊异；评估为极高新奇与壮美；促进凝视、记录与意义扩展。",
        },
        "Anticipation": {
            "Interest": "中等激活的积极探索；评估为信息缺口可被弥合、可控；功能是专注、学习与试探。",
            "Anticipation": "面向未来的前摄情绪；评估为事件概率中高且可准备；促进计划、资源调配与预演。",
            "Vigilance": "高激活的前摄监控；评估为不确定且潜在有害；维持高监测与预案，注意焦点狭窄。",
        },
    }

    @staticmethod
    def analyze_emotion(user_message: str, context: str = "") -> str:
        """Generate emotion analysis prompt."""
        return f"""
你是一个专业的情感分析专家。请分析以下用户消息的情感状态：

用户消息：{user_message}
上下文：{context}

请严格按照以下详细的情感分类体系进行分析，识别结果必须是以下二级情绪类目之一，不得出现约定以外的情绪：

一级情绪（8种基本情绪）及其对应的二级情绪类目：

1. Joy（喜悦）系列：
   - Serenity（平静）：低激活的积极情绪
   - Joy（喜悦）：中等激活的奖励达成情绪
   - Ecstasy（入迷）：极高激活的强正向高峰体验

2. Sadness（悲伤）系列：
   - Pensiveness（深思）：轻度哀伤与反思
   - Sadness（悲伤）：中强度的损失情绪
   - Grief（悲痛）：高强度、长期化的丧失反应

3. Trust（信任）系列：
   - Acceptance（接受）：低激活正向
   - Trust（信任）：对他者意图与能力的正面预测
   - Admiration（敬佩）：对他者能力/品格的高评价

4. Disgust（厌恶）系列：
   - Boredom（无趣）：低激活负性
   - Disgust（厌恶）：对污染的排斥反应
   - Loathing（嫌弃）：极强烈厌恶与道德排斥

5. Fear（恐惧）系列：
   - Apprehension（紧张）：低至中激活的预期性威胁感
   - Fear（害怕）：中高激活的威胁反应
   - Terror（恐慌）：极高激活、即时生存威胁

6. Anger（愤怒）系列：
   - Annoyance（烦忧）：低强度愤怒
   - Anger（生气）：中强度攻势性情绪
   - Rage（暴躁）：高强度、可能失控的愤怒

7. Surprise（惊讶）系列：
   - Distraction（分心）：注意被新奇或干扰短暂劫持
   - Surprise（惊讶）：对预测误差的快速反应
   - Amazement（叹为观止）：高强度、正效价的惊异

8. Anticipation（期待）系列：
   - Interest（感兴趣）：中等激活的积极探索
   - Anticipation（盼望）：面向未来的前摄情绪
   - Vigilance（警惕）：高激活的前摄监控

严格约束：
1. 识别结果必须是上述24个二级情绪类目之一
2. 不得使用任何其他情绪词汇
3. 如果无法准确匹配，请选择最接近的二级情绪类目
4. 情感强度必须在1-10分范围内

请以JSON格式返回分析结果：
{{
    "emotion": "二级情绪名称（必须是上述24个类目之一）",
    "primary_emotion": "一级情绪名称（必须是上述8个类目之一）",
    "intensity": 数字（1-10分）,
    "confidence": 0.95,
    "emotion_tendency": "积极/消极/中性",
    "emotion_change": "变化描述",
    "emotion_description": "基于二级情绪描述的详细分析"
}}
"""

    @staticmethod
    def emotion_response_template(
        primary_emotion: str, secondary_emotion: str, intensity: int
    ) -> str:
        """Generate appropriate response based on emotion."""
        return f"""
基于检测到的情感状态（一级情绪：{primary_emotion}，二级情绪：{secondary_emotion}，强度：{intensity}/10），请生成一个合适的回应。

回应要求：
1. 情感匹配：回应应该与用户的情感状态相匹配
2. 支持性：根据二级情绪的特点提供相应的支持
3. 自然性：保持对话的自然流畅
4. 个性化：根据用户的情感状态调整回应风格
5. 功能性：考虑该情绪的功能性作用，提供相应的引导

请生成一个温暖、理解且适合当前情感状态的回应。
"""

    @staticmethod
    def build_single_message_emotion_prompt(user_message: str, user_id: str) -> str:
        """构建单条消息情绪识别提示词"""
        return f"""
请分析以下用户消息的情绪状态：

用户消息：
"{user_message}"

用户ID：{user_id}

请严格按照Plutchik情绪轮的一级和二级情绪分类体系进行分析，识别结果必须是以下二级情绪类目之一，不得出现约定以外的情绪：

一级情绪（8种基本情绪）及其对应的二级情绪类目：

1. Joy（喜悦）系列：
   - Serenity（平静）：低激活的积极情绪
   - Joy（喜悦）：中等激活的奖励达成情绪
   - Ecstasy（入迷）：极高激活的强正向高峰体验

2. Sadness（悲伤）系列：
   - Pensiveness（深思）：轻度哀伤与反思
   - Sadness（悲伤）：中强度的损失情绪
   - Grief（悲痛）：高强度、长期化的丧失反应

3. Trust（信任）系列：
   - Acceptance（接受）：低激活正向
   - Trust（信任）：对他者意图与能力的正面预测
   - Admiration（敬佩）：对他者能力/品格的高评价

4. Disgust（厌恶）系列：
   - Boredom（无趣）：低激活负性
   - Disgust（厌恶）：对污染的排斥反应
   - Loathing（嫌弃）：极强烈厌恶与道德排斥

5. Fear（恐惧）系列：
   - Apprehension（紧张）：低至中激活的预期性威胁感
   - Fear（害怕）：中高激活的威胁反应
   - Terror（恐慌）：极高激活、即时生存威胁

6. Anger（愤怒）系列：
   - Annoyance（烦忧）：低强度愤怒
   - Anger（生气）：中强度攻势性情绪
   - Rage（暴躁）：高强度、可能失控的愤怒

7. Surprise（惊讶）系列：
   - Distraction（分心）：注意被新奇或干扰短暂劫持
   - Surprise（惊讶）：对预测误差的快速反应
   - Amazement（叹为观止）：高强度、正效价的惊异

8. Anticipation（期待）系列：
   - Interest（感兴趣）：中等激活的积极探索
   - Anticipation（盼望）：面向未来的前摄情绪
   - Vigilance（警惕）：高激活的前摄监控

严格约束：
1. 识别结果必须是上述24个二级情绪类目之一
2. 不得使用任何其他情绪词汇
3. 如果无法准确匹配，请选择最接近的二级情绪类目
4. 情感强度必须在1-10分范围内

请返回JSON格式的分析结果：
{{
    "emotion": "二级情绪名称（必须是上述24个类目之一）",
    "primary_emotion": "一级情绪名称（必须是上述8个类目之一）",
    "intensity": 数字（1-10分）,
    "confidence": 0.95,
    "description": "情绪描述",
    "analysis_timestamp": "分析时间戳"
}}
"""

    @staticmethod
    def analyze_single_message_only(user_message: str, user_id: str) -> dict:
        """基于单条消息进行情绪分析（备选方法）"""
        from datetime import datetime
        
        # 简单的关键词匹配分析
        message_lower = user_message.lower()
        
        # 情绪关键词映射
        emotion_keywords = {
            "Joy": ["开心", "高兴", "快乐", "兴奋", "愉快", "满意", "喜欢", "爱"],
            "Sadness": ["难过", "伤心", "悲伤", "失望", "沮丧", "痛苦", "哭泣"],
            "Anger": ["生气", "愤怒", "恼火", "烦躁", "讨厌", "恨", "愤怒"],
            "Fear": ["害怕", "恐惧", "担心", "紧张", "焦虑", "不安"],
            "Surprise": ["惊讶", "意外", "震惊", "吃惊", "没想到"],
            "Disgust": ["恶心", "厌恶", "反感", "讨厌", "嫌弃"],
            "Trust": ["信任", "相信", "放心", "可靠", "安全"],
            "Anticipation": ["期待", "盼望", "希望", "等待", "准备"]
        }
        
        # 计算情绪得分
        emotion_scores = {}
        for emotion, keywords in emotion_keywords.items():
            score = sum(1 for keyword in keywords if keyword in message_lower)
            emotion_scores[emotion] = score
        
        # 找到得分最高的情绪
        if emotion_scores:
            primary_emotion = max(emotion_scores, key=emotion_scores.get)
            if emotion_scores[primary_emotion] > 0:
                # 根据情绪选择二级情绪
                secondary_emotions = {
                    "Joy": "Joy",
                    "Sadness": "Sadness", 
                    "Anger": "Anger",
                    "Fear": "Fear",
                    "Surprise": "Surprise",
                    "Disgust": "Disgust",
                    "Trust": "Trust",
                    "Anticipation": "Interest"
                }
                
                return {
                    "user_id": user_id,
                    "emotion": secondary_emotions.get(primary_emotion, "Joy"),
                    "primary_emotion": primary_emotion,
                    "intensity": min(emotion_scores[primary_emotion] + 3, 10),
                    "confidence": 0.6,
                    "description": f"基于关键词分析识别为{primary_emotion}情绪",
                    "analysis_timestamp": datetime.now().isoformat()
                }
        
        # 默认返回中性情绪
        return {
            "user_id": user_id,
            "emotion": "Serenity",
            "primary_emotion": "Joy",
            "intensity": 5,
            "confidence": 0.5,
            "description": "未检测到明显情绪，默认为平静状态",
            "analysis_timestamp": datetime.now().isoformat()
        }

    @staticmethod
    def build_emotion_recognition_prompt(conversation: str, user_id: str) -> str:
        """构建情绪识别提示词"""
        return f"""
请分析以下对话中的用户情绪状态：

对话内容：
{conversation}

用户ID：{user_id}

请严格按照Plutchik情绪轮的一级和二级情绪分类体系进行分析，识别结果必须是以下二级情绪类目之一，不得出现约定以外的情绪：

一级情绪（8种基本情绪）及其对应的二级情绪类目：

1. Joy（喜悦）系列：
   - Serenity（平静）：低激活的积极情绪
   - Joy（喜悦）：中等激活的奖励达成情绪
   - Ecstasy（入迷）：极高激活的强正向高峰体验

2. Sadness（悲伤）系列：
   - Pensiveness（深思）：轻度哀伤与反思
   - Sadness（悲伤）：中强度的损失情绪
   - Grief（悲痛）：高强度、长期化的丧失反应

3. Trust（信任）系列：
   - Acceptance（接受）：低激活正向
   - Trust（信任）：对他者意图与能力的正面预测
   - Admiration（敬佩）：对他者能力/品格的高评价

4. Disgust（厌恶）系列：
   - Boredom（无趣）：低激活负性
   - Disgust（厌恶）：对污染的排斥反应
   - Loathing（嫌弃）：极强烈厌恶与道德排斥

5. Fear（恐惧）系列：
   - Apprehension（紧张）：低至中激活的预期性威胁感
   - Fear（害怕）：中高激活的威胁反应
   - Terror（恐慌）：极高激活、即时生存威胁

6. Anger（愤怒）系列：
   - Annoyance（烦忧）：低强度愤怒
   - Anger（生气）：中强度攻势性情绪
   - Rage（暴躁）：高强度、可能失控的愤怒

7. Surprise（惊讶）系列：
   - Distraction（分心）：注意被新奇或干扰短暂劫持
   - Surprise（惊讶）：对预测误差的快速反应
   - Amazement（叹为观止）：高强度、正效价的惊异

8. Anticipation（期待）系列：
   - Interest（感兴趣）：中等激活的积极探索
   - Anticipation（盼望）：面向未来的前摄情绪
   - Vigilance（警惕）：高激活的前摄监控

严格约束：
1. 识别结果必须是上述24个二级情绪类目之一
2. 不得使用任何其他情绪词汇
3. 如果无法准确匹配，请选择最接近的二级情绪类目
4. 情感强度必须在1-10分范围内

请返回JSON格式的分析结果：
{{
    "emotion": "二级情绪名称（必须是上述24个类目之一）",
    "primary_emotion": "一级情绪名称（必须是上述8个类目之一）",
    "intensity": 数字（1-10分）,
    "confidence": 0.95,
    "description": "情绪描述"
}}
"""

    @staticmethod
    def extract_emotion_from_text(text: str, user_id: str) -> dict:
        """从文本中提取情绪信息"""
        # 这里可以添加更复杂的文本解析逻辑
        return {
            "emotion": "Joy",  # 直接返回二级情绪
            "primary_emotion": "Joy",
            "intensity": 5,
            "confidence": 0.8,
            "description": "检测到积极情绪",
        }

    @staticmethod
    def validate_emotion_data(data: dict) -> bool:
        """验证情绪数据的有效性"""
        required_fields = ["emotion", "intensity"]
        return all(field in data for field in required_fields)

    @staticmethod
    def analyze_conversation_only(conversation: str, user_id: str) -> dict:
        """仅基于对话内容进行情绪分析"""
        # 构建情绪识别提示词
        prompt = EmotionRecognitionTemplates.build_emotion_recognition_prompt(
            conversation, user_id
        )

        # 这里应该调用LLM服务进行实际的情绪分析
        # 由于我们没有实际的LLM服务，我们使用简单的关键词匹配
        conversation_lower = conversation.lower()

        # 情绪关键词匹配
        emotion_keywords = {
            "喜悦": ["开心", "高兴", "快乐", "棒", "升职", "庆祝", "轻飘飘"],
            "悲伤": ["去世", "宠物", "心碎", "痛苦", "难过", "迷茫"],
            "愤怒": ["气疯", "偷", "可恶", "投诉", "生气"],
            "恐惧": ["害怕", "跟着", "心跳", "恐慌"],
            "信任": ["老师", "棒", "敬业", "敬佩", "尊敬"],
            "厌恶": ["卫生", "老鼠", "恶心", "嫌弃"],
            "惊讶": ["哇", "神奇", "不敢相信", "魔术师"],
            "期待": ["旅行", "等不及", "盼望", "希望"],
        }

        # 计算每种情绪的匹配度
        emotion_scores = {}
        for emotion, keywords in emotion_keywords.items():
            score = sum(1 for keyword in keywords if keyword in conversation_lower)
            if score > 0:
                emotion_scores[emotion] = score

        # 选择得分最高的情绪
        if emotion_scores:
            detected_emotion = max(emotion_scores, key=emotion_scores.get)
            confidence = min(0.9, 0.6 + emotion_scores[detected_emotion] * 0.1)

            # 根据情绪强度调整
            intensity_map = {
                "喜悦": 7 if "升职" in conversation_lower else 5,
                "悲伤": 8 if "去世" in conversation_lower else 6,
                "愤怒": 8 if "气疯" in conversation_lower else 6,
                "恐惧": 8 if "跟着" in conversation_lower else 6,
                "信任": 7 if "敬佩" in conversation_lower else 5,
                "厌恶": 8 if "老鼠" in conversation_lower else 6,
                "惊讶": 8 if "不敢相信" in conversation_lower else 6,
                "期待": 6 if "等不及" in conversation_lower else 5,
            }

            intensity = intensity_map.get(detected_emotion, 5)

            return {
                "emotion": detected_emotion,
                "primary_emotion": detected_emotion,
                "intensity": intensity,
                "confidence": confidence,
                "description": f"基于关键词匹配检测到{detected_emotion}情绪",
            }
        else:
            return {
                "emotion": "平静",
                "primary_emotion": "喜悦",
                "intensity": 3,
                "confidence": 0.5,
                "description": "未检测到明显情绪，默认为平静状态",
            }


class EmotionWheelTemplates:
    """Templates for Plutchik's emotion wheel analysis."""

    @staticmethod
    def emotion_wheel_analysis() -> str:
        """Generate emotion wheel analysis prompt."""
        return """
请使用Plutchik情感轮来分析用户的情感状态。

Plutchik情感轮包含8种基本情感（一级情绪）：
- Joy（喜悦）
- Trust（信任）
- Fear（害怕）
- Surprise（惊讶）
- Sadness（难过）
- Disgust（厌恶）
- Anger（生气）
- Anticipation（盼望）

每种情感都有三个强度级别（二级情绪）：
- 弱：Serenity, Pensiveness, Acceptance, Boredom, Apprehension, Annoyance, Distraction, Interest
- 中：Joy, Sadness, Trust, Disgust, Fear, Anger, Surprise, Anticipation
- 强：Ecstasy, Grief, Admiration, Loathing, Terror, Rage, Amazement, Vigilance

请分析用户的情感状态并返回：
1. 一级情绪（主要情感）
2. 二级情绪（强度级别）
3. 情感强度（1-10分）
4. 情感组合（如果有多种情感）
5. 情感变化趋势
6. 基于二级情绪描述的功能性分析
"""
